/*
 * @Author: your name
 * @Date: 2021-05-13 12:17:55
 * @LastEditTime: 2021-05-13 17:57:49
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \erabbit\src\store\modules\cart.js
 */
// 购物车状态
export default {
  namespaced: true,
  state: () => ({
    list: []// 购物车列表
  }),
  getters: {
    //   有效列表
    validList (state) {
      // 经过计算返回计算之后的数据
      // 计算逻辑：.isEffective为true并且库存不为零
      return state.list.filter(item => item.isEffective && item.stock !== 0)
    },
    // 有效总数
    validCound (state, getters) {
      // 把validList中的所有项的count字段加起来
      return getters.validList.reduce((a, c) => {
        // a代表0初始值，c代表getters里面的validList每一项
        return a + c.count
      }, 0)
    },
    validAllPrice (state, getters) {
      return getters.validList.reduce((a, c) => {
        return a + ((c.nowPrice * 100) * (c.count * 100)) / 10000
      }, 0)
    },
    // 已选择商品总数
    selectedListCount (state) {
      // selected为true
      return state.list.filter(item => item.selected === true).length
    },
    // 全选getters
    allSelecte (state) {
      return state.list.every(item => item.selected === true)
    },
    // 选中商品合计
    selectedAllPrice (state) {
      // 筛选出所有selected字段为true的项目
      // 把所有项目中的数量乘以nowPrice进行叠加
      return state.list.filter(item => item.selected).reduce((a, c) => {
        return a + (c.count * c.noePrice * 100) / 100
      }, 0)
    }
  },
  mutations: {
    //   加入购物车
    insertCart (state, good) { // insertCart有两个参数state()方便拿到当前系统下的数据, good(实参)代表商品
      // 如果当前没有添加过商品直接调用unshift(good)
      // 如果当前添加过商品直接调用不执行unshift，而是基于当前商品的count字段加一
      console.log('当前的商品的是', good)
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      if (index > -1) {
        state.list[index].count = state.list[index].count + good.count
      } else {
        state.list.unshift(good)
      }
    },
    //   删除
    delCart (state, good) {
      // 通过good下面的skuId去找state中的list查找，
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      if (index > -1) {
        state.list.splice(index, 1)
      }
    },
    // 单选功能
    singleCheck (state, { good, selected }) {
      const item = state.list.findIndex(item => item.skuId === good.skuId)
      item.selected = selected
    },
    // 全选功能
    allCheck (state, selected) {
      state.list.forEach(item => {
        item.selected = selected
      })
    },
    // 修改数量
    changeCount (state, { good, count }) {
      const item = state.list.find(item => item.skuId === good.skuId)
      item.count = count
    }
  },
  actions: {
    // 区分状态登录和未登录token
    // rootState可以直接拿到根状态数据，跨模块去拿数据的方法
    acyncInsertCart (ctx, good) {
      // ctx.rootState.user.profile.token
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          //   登录
        } else {
          //   未登录
          // 提交mutation函数，提交完毕之后吧状态resolve掉
          ctx.commit('insertCart', good)
          resolve()
        }
      })
    },
    //   删除
    acyncDelCart (ctx, good) {
      // ctx.rootState.user.profile.token
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          //   登录
        } else {
          //   未登录
          // 提交mutation函数，提交完毕之后吧状态resolve掉
          ctx.commit('delCart', good)
          resolve()
        }
      })
    },
    // 单选
    acyncSingleCheck (ctx, { good, selected }) {
      // ctx.rootState.user.profile.token
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          //   登录
        } else {
          //   未登录
          // 提交mutation函数，提交完毕之后吧状态resolve掉
          ctx.commit('singleCheck', { good, selected })
          resolve()
        }
      })
    },
    // 全选
    acyncAllCheck (ctx, { good, selected }) {
      // ctx.rootState.user.profile.token
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          //   登录
        } else {
          //   未登录
          // 提交mutation函数，提交完毕之后吧状态resolve掉
          ctx.commit('allCheck', selected)
          resolve()
        }
      })
    },
    // 修改
    acyncChangeCount (ctx, { good, count }) {
      // ctx.rootState.user.profile.token
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          //   登录
        } else {
          //   未登录
          // 提交mutation函数，提交完毕之后吧状态resolve掉
          ctx.commit('changeCount', { good, count })
          resolve()
        }
      })
    }
  }

}
